iT邦幫忙

2023 iThome 鐵人賽

DAY 22
1
Software Development

Qt 6 跨平台應用程式開發系列 第 22

D22: 看圖軟體(十) 彈出視窗

  • 分享至 

  • xImage
  •  

今天來介紹彈出視窗。

彈出視窗是一種很常見的軟體通知形式,拿來明確、直接的告知使用者「這裡有事情需要注意喔!」像這樣:
Corrupt

挺嚇人的吧,但是彈出視窗不失為一個很有效的通知方式。我們今天就來看看 Qt 怎麼實現彈出視窗吧。

QMessageBox

Qt 的彈出通知視窗叫做 QMessageBox

以下是一個最簡單的用法:

QMessageBox msgBox;
msgBox.setText("檔案損毀,無法開啟!");
msgBox.exec();

我們先建構一個QMessageBox物件,用setText()設定顯示文字,然後呼叫exec(),這樣就會彈出一個通知視窗了。彈出視窗會站在主視窗前方,而且在關掉通知視窗之前,你沒辦法操作主視窗。

要注意 msgBox.exec(); 是一個 blocking (阻塞式) 函數,也就是說,在彈出視窗關閉之前,程式都不會往下跑,會停在這一行。直到使用者關閉彈出視窗之後,下面的程式碼才會繼續執行。

QMessageBox 還有更進階的用法,除了指定顯示文字以外,還有要顯示哪些按鈕:

QMessageBox msgBox;
msgBox.setText("檔案已經被修改!");
msgBox.setInformativeText("要儲存檔案嗎?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();

MessageBox2

最後可以根據 msgBox.exec(); 的回傳值,得知使用者按了哪個按鈕。

switch (ret) {
  case QMessageBox::Save:
      break;
  case QMessageBox::Discard:
      break;
  case QMessageBox::Cancel:
      break;
}

彈出視窗:檔案無法開啟

請打開昨天的專案,在今天之前,我們並沒有處理檔案格式不支援的問題。

現在的目標是:當檔案無法開啟時,要彈出警告視窗並告訴使用者「不支援的檔案格式」!

打開 mainwindow.cpp 並且修改 loadImage() 成員函數。當 QImageReader 讀取失敗時,我們用上面的技巧,設定彈出視窗並給予提示文字。除此之外,還用了 msgBox.setIcon() 方法,顯示一個黃色的「警告」的圖示

void MainWindow::loadImage(const QString& fileName)
{
    QImageReader reader(fileName);
    reader.setAutoTransform(true);
    const QImage newImage = reader.read();
    if (newImage.isNull())
    {
        QMessageBox msgBox;
        msgBox.setText("不支援的檔案格式!");
        msgBox.setInformativeText("請打開PNG或JPG");
        msgBox.setIcon(QMessageBox::Warning);
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
        return;
    }
...

FileFormat

這樣我們就完成彈出視窗囉!


上一篇
D21: 看圖軟體(九) 鍵盤快速鍵
下一篇
D23: 看圖軟體(十一) 縮放圖片
系列文
Qt 6 跨平台應用程式開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言